import router from './router'

import NProgress from 'nprogress' // progress 进度条
import 'nprogress/nprogress.css' // progress bar style

import {
	getToken
} from './utils/auth'
import store from './store/index'

// 判断当前路由是否可访问，如果不能统一跳转到 401
function hasPermission(roles, permissionRoles) {
	if (!permissionRoles) return true
	return roles.some(role => permissionRoles.indexOf(role) >= 0)
}

const whiteList = ['/login']

router.beforeEach((to, from, next) => {
	NProgress.start()
	/**
	 * 判断是否已登录/是否存在 token
	 * 1. 如果存在 token，在登陆页就自动跳转到首页；
	 * 2. 否则会判断状态管理中是否存在权限数据
	 *  2.1 如果存在直接下一步
	 *  2.1 如果不存在就需要调用用户接口，获取到权限数据
	 */
	if (getToken()) {
		if (to.path === '/login') {
			next({
				path: '/'
			})
		} else {
			if (store.getters.roles.length < 1) {
				// 请求接口获取用户权限信息
				store.dispatch('getUserInfo').then(res => {
					const roles = res

					// 根据用户权限信息添加路由表
					store.dispatch('GenerateRoutes', {
						roles
					}).then(() => {
						store.getters.addRouters.forEach(val => {
							router.addRoute(val)
						})

						next({
							...to,
							replace: true
						})
					})
				}).catch(() => {
					store.dispatch('signOut').then(() => {
						next({
							path: '/'
						})
					})
				})
			} else {
				if (hasPermission(store.getters.roles, to.meta.roles)) {
					next()
				} else {
					next({
						path: '/401',
						replace: true,
						query: {
							noGoBack: true
						}
					})
				}
			}
		}
	} else {
		/**
		 * token 不存在
		 * 判断是否是免登录，如果是不做处理
		 * 如果不是，跳转到登陆页
		 */
		if (whiteList.indexOf(to.path) !== -1) {
			next()
		} else {
			store.dispatch("setRou")
			next()
			//next({ path: '/login' })
		}
	}
})

router.afterEach(() => {
	NProgress.done()
})
